class Clock
   # Constructeur
   #   size : taille du vector clock
   #   init : initialisation de l'horloge. Le tableau
   #          d'initialisation doit avoir la même taille
   #          que le raparètre init
  def initialize(size, init = [])
     if not init.is_a?(Array)
        raise "Clock.initialize : second parameter must be an Array"
     end
     if not init.empty? and init.length != size
        raise "Clock.initialize : wrong clock initialization size"
     end
  
    if not init.empty?
      @vector = init
    else
       @vector = Array.new(size, 0)
    end
  end
  
  # Retourne la valeur de l'horloge à la position donnée
  #    pos : position de l'horloge (commence à 0)
  def at(pos)
     if pos < 0 or pos > @vector.length - 1
        raise "Clock.at : invalid position"
     end
     
     return @vector[pos]
  end
  
   # Incrémentation d'une horloge dans le vecteur
   #    pos : position de l'horloge (commence à 0)
   def inc(pos)
      if pos < 0 or pos > @vector.length - 1
         raise "Clock.inc : invalid position"
      end

      @vector[pos] = @vector[pos] + 1
   end

   # Sérialisation d'un vector clock
   def to_s
      return @vector.inspect
   end
  
   # Methode statique
   # Desérialisation d'un vector clock
   def Clock.from_s(stringArray)
      tmp = stringArray[1, stringArray.length-2]
      a = tmp.split(", ")
      a.map! {|x| x.to_i }
      return Clock.new(a.length, a)
   end
end


class Message
   attr_reader :clock, :content
      
   #Constructeur
   #    clock : Vector clock du message
   #    content : Contenu du message
   def initialize(clock, content)
      if clock.is_a?(Clock)
         raise "Message.initialize : first parameter must be a Clock"
      end
      if content.is_a?(String)
         raise "Message.initialize : second parameter must be a String"
      end

      @clock = clock
      @content = content
   end
end